Conv2DBackpropInputFusion ========================= 计算二维卷积反向传播的输入梯度(Conv2D backprop input fusion),支持普通卷积、Depthwise 卷积以及 1x1 优化路径,多个核心通过核掩码协同完成批次并行。 .. math:: dx = \text{Conv2D}^\top(dy, w) 输入: - **dy** - 输出梯度张量首地址,形状 ``[batch, out_h, out_w, out_channel]``。 - **w** - 卷积权重张量首地址,形状 ``[out_channel, kernel_h, kernel_w, in_channel/group]``。 - **conv_param** - 卷积参数结构体地址,包含 ``stride``、``pad``、``dilation``、``group``、输入输出维度、批次数及共享工作空间指针等信息。 ConvParameter 字段说明: - ``workspace_`` - 指向算子运行时使用的临时工作空间,需满足对齐与容量要求。 - ``output_batch_`` - 输出梯度 ``dy`` 的批次数(通常等于输入批次数)。 - ``input_batch_`` - 正向输入 ``x`` 的批次数,用于与 ``output_batch_`` 校验。 - ``input_h_`` / ``input_w_`` - 正向输入特征图的高度与宽度。 - ``output_h_`` / ``output_w_`` - 输出梯度特征图的高度与宽度。 - ``input_channel_`` / ``output_channel_`` - 输入与输出通道数,需与 ``group_`` 配合满足整除关系。 - ``kernel_h_`` / ``kernel_w_`` - 卷积核的高与宽。 - ``group_`` - 组卷积数量,``group_ = 1`` 表示普通卷积。 - ``pad_l_`` / ``pad_r_`` / ``pad_u_`` / ``pad_d_`` - 分别表示左右上下方向的填充大小。 - ``dilation_h_`` / ``dilation_w_`` - 核心采样间隔(膨胀系数)。 - ``stride_h_`` / ``stride_w_`` - 滑动窗口在高、宽方向的步长。 - ``buffer_size_`` - 分配给 ``workspace_`` 的缓冲区字节数,在运行前需要正确设置。 - ``nweights_`` - 卷积权重 ``w`` 的元素总数,用于内部分块和校验。 - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 输出: - **dx** - 输入梯度张量首地址,形状 ``[batch, in_h, in_w, in_channel]``。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持 fp32 数据类型。 - MT7004 支持 fp16、fp32 数据类型。 - 需在 ``conv_param->workspace_`` 中预先分配共享工作空间,并设置 ``conv_param->buffer_size_``。 **共享存储版本:** .. c:function:: void hp_conv2dbackpropinputfusion_s(const half *dy, const half *w, half *dx, ConvParameter *conv_param, int core_mask) .. c:function:: void fp_conv2dbackpropinputfusion_s(const float *dy, const float *w, float *dx, ConvParameter *conv_param, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 34 // FT78NE 多核示例 #include #include "conv_parameter.h" int main(void) { const float *dy = (const float *)0xA0000000; // DDR 存储 const float *w = (const float *)0xB0000000; float *dx = (const float *)0xC0000000; ConvParameter *param = (ConvParameter *)0xB0001000; // 卷积参数共享区域 // 设置 ConvParameter 字段 param->workspace_ = (void *)0xB0002000; // 共享工作空间 param->buffer_size_ = 0x20000; param->input_batch_ = 1; param->input_h_ = 5; param->input_w_ = 5; param->input_channel_ = 4; param->output_batch_ = 1; param->output_h_ = 3; param->output_w_ = 3; param->output_channel_ = 8; param->kernel_h_ = 3; param->kernel_w_ = 3; param->group_ = 1; param->pad_u_ = 1; param->pad_d_ = 1; param->pad_l_ = 1; param->pad_r_ = 1; param->dilation_h_ = 1; param->dilation_w_ = 1; param->stride_h_ = 2; param->stride_w_ = 2; param->nweights_ = 8 * 3 * 3 * 4; // 示例值 int core_mask = 0xff; fp_conv2dbackpropinputfusion_s(dy, w, dx, param, core_mask); return 0; } **私有存储版本:** .. c:function:: void hp_conv2dbackpropinputfusion_p(const half *dy, const half *w, half *dx, ConvParameter *conv_param) .. c:function:: void fp_conv2dbackpropinputfusion_p(const float *dy, const float *w, float *dx, ConvParameter *conv_param) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 33 // MT7004 单核示例 #include #include "conv_parameter.h" int main(void) { const half *dy = (const half *)0x10000000; // L2 存储 const half *w = (const half *)0x10020000; half *dx = (half *)0x10040000; ConvParameter *param = (ConvParameter *)0x10060000; // 设置 ConvParameter 字段 param->workspace_ = (void *)0x10070000; param->buffer_size_ = 0x10000; param->input_batch_ = 1; param->input_h_ = 5; param->input_w_ = 5; param->input_channel_ = 4; param->output_batch_ = 1; param->output_h_ = 3; param->output_w_ = 3; param->output_channel_ = 8; param->kernel_h_ = 3; param->kernel_w_ = 3; param->group_ = 1; param->pad_u_ = 1; param->pad_d_ = 1; param->pad_l_ = 1; param->pad_r_ = 1; param->dilation_h_ = 1; param->dilation_w_ = 1; param->stride_h_ = 2; param->stride_w_ = 2; param->nweights_ = 8 * 3 * 3 * 4; // 示例值 hp_conv2dbackpropinputfusion_p(dy, w, dx, param); return 0; }